package effective_go

// 使用 new 关键字分配内存

/*
p := new(SyncedBuffer)  // type *SyncedBuffer
var v SyncedBuffer      // type  SyncedBuffer
 */

// 构造函数和复合字面量

// 使用 make 分配
// 内建函数 make(T,args) 的目的不同于 new(T)。它 只用于 创建切片、映射和信道，
// 并返回类型为 T（而非 *T）的一个已初始化 （而非置零）的值。
// make 只适用于映射、切片和信道且不返回指针。

// 数组
func Sum(a *[3]float64) (sum float64) {
	for _, v := range *a {
		sum += v
	}
	return
}

// 切片
// 切片通过对数组进行封装，为数据序列提供了更通用、强大而方便的接口。
// 除了矩阵变换这类需要明确维度的情况外，Go 中的大部分数组编程都是通过切片来完成的。
// 切片的容量可通过内建函数 cap 获得，它将给出该切片可取得的最大长度。
// 以下是将数据追加到切片的函数。若数据超出其容量，则会重新分配该切片。返回值即为所得的切片。
func Append(slice, data []byte) []byte {
	l := len(slice)
	if l + len(data) > cap(slice) {
		// 重新分配 为未来的增长，双重分配所需的内容
		newSlice := make([]byte, (l + len(data)) * 2)
		copy(newSlice, slice)
		slice = newSlice
	}
	slice = slice[0:len(data)]
	copy(slice[l:], data)
	return slice
}

// 二维切片

// 映射

// 打印

// 追加 append